/*******************************************************************************
* Copyright 2003-2020 Intel Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/

/* 
// 
//  Purpose:
//     Cryptography Primitive.
//     EC over Prime Finite Field (initialization)
// 
//  Contents:
//        ippsECCPGetSize()
//
*/

#include "owndefs.h"
#include "owncp.h"
#include "pcpeccp.h"

/*F*
//    Name: ippsECCPGetSize
//
// Purpose: Returns size of ECC context (bytes).
//
// Returns:                   Reason:
//    ippStsNullPtrErr           NULL == pSize
//
//    ippStsSizeErr              2 > feBitSize
//                               feBitSize > EC_GFP_MAXBITSIZE
//    ippStsNoErr                no errors
//
// Parameters:
//    feBitSize   size of field element (bits)
//    pSize       pointer to the size of internal ECC context
//
*F*/
IPPFUN(IppStatus, ippsECCPGetSize, (int feBitSize, int *pSize))
{
   /* test size's pointer */
   IPP_BAD_PTR1_RET(pSize);

   /* test size of field element */
   IPP_BADARG_RET((2>feBitSize || feBitSize>EC_GFP_MAXBITSIZE), ippStsSizeErr);

   {
      /* size of GF context */
      //int gfCtxSize = cpGFpGetSize(feBitSize);
      int gfCtxSize = cpGFpGetSize(feBitSize, feBitSize+BITSIZE(BNU_CHUNK_T), GFP_POOL_SIZE);
      /* size of EC context */
      int ecCtxSize = cpGFpECGetSize(1, feBitSize);

      /* size of EC scratch buffer: 16 points of BITS_BNU_CHUNK(feBitSize)*3 length each */
      int ecScratchBufferSize = 16*(BITS_BNU_CHUNK(feBitSize)*3)*(Ipp32s)sizeof(BNU_CHUNK_T);

      *pSize = ecCtxSize            /* EC context */
              +ECGFP_ALIGNMENT
              +gfCtxSize            /* GF context */
              +GFP_ALIGNMENT
              +ecScratchBufferSize  /* *scratch buffer */
              +ecScratchBufferSize  /* should be enough for 2 tables */
              +CACHE_LINE_SIZE;

      return ippStsNoErr;
   }
}
